package polymorphic;

import com.sun.org.apache.bcel.internal.generic.FSUB;

/**
 * @Package: polymorphic
 * @ClassName: Test
 * @Author: x2606
 * @CreateTime: 2022/2/22 21:01
 * @Description: 多态
 */

public class Polymorphic {
    public static void main(String[] args) {
        // 多态的向上转型
        // 多态的本质：父类的引用指向了子类对象
        // 语法：`父类类型 引用名 = new 子类类型()`
        //特点：编译类型看左边，运行类型看右边，可以调用父类中所有成员（需要遵守访问权限），不可以调用子类中特有成员。
        Base n1 = new SubA();
        n1.getInfo();
        //System.out.println(n1.age);



        // 语法：`子类类型 引用名 = (子类类型) 父类引用`
        //只能强转父类的引用，不能强转父类的对象
        // 要求父类的引用必须指向的是当前类型的对象
        // 可以调用子类类型中所有的成员
        Base n2 = new SubB();
        n2.getInfo();
        SubB n3=(SubB) n2;
        System.out.println(n3.age);

        //instanceof 用于判断对象的运行类型是否为XX类型或者XX类型的子类型,返回true或false。
        System.out.println(n1 instanceof Base);
        System.out.println(n1 instanceof SubA);
        System.out.println(n2 instanceof Base);
        System.out.println(n3 instanceof Base);
        System.out.println(n3 instanceof Object);

        Object obj=null;
        System.out.println(obj instanceof Base);
    }
}

class Base {
    String name = "base";
    public void getInfo(){
        System.out.println(name);
    }
}

class SubA extends Base {
    String name = "subA";
    int age = 10;
    public void getInfo(){
        System.out.println(name);
    }
}
class SubB extends Base {
    String name = "subB";
    int age = 20;
    public void getInfo(){
        System.out.println(name);
    }
}

